/* 
 * YAMLPARSER
 *
 * */
#ifndef YAMLPARSER_H_
#define YAMLPARSER_H_

#include "yaml-cpp/yaml.h"
#include "Logger.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

#define DEFAULT_YAML "../Resources/juego.yaml"

struct Conexion_y {
    std::string                     host;
    int                             port;
};

struct Pantalla_y {
    int                             ancho;
    int                             alto;
};

struct Parametros {
    int                             vel_personaje;
    int                             margen_scroll;
};

struct Personaje_n {
    std::string                     tipo;
    int                             x;
    int                             y;
    std::string                     orientacion;
};

struct Obstaculo_n {
    std::string                     tipo;
    int                             x;
    int                             y;
    std::string                     orientacion;
};

struct Plataforma_y {
    std::string                     textura;
    std::string                     imagen;
    int                             x;
    int                             y;
    int                             ancho;
    int                             alto;
    int                             angulo;
};

struct Escalera_y {
    std::string                     textura;
    std::string                     imagen;
    int                             x;
    int                             y;
    int                             ancho;
    int                             alto;
};

struct Nivel_y {
    std::string                     nombre;
    int                             ancho;
    int                             alto;
    int                             gravedad;
    int                             piso;
    std::string                     fondo;
    std::string                     sonido;
    std::vector <Personaje_n>       personajes;
    std::vector <Obstaculo_n>       obstaculos;
    std::vector <Plataforma_y>      plataformas;
    std::vector <Escalera_y>        escaleras;
};

/*
struct Sonido_y {
    std::string                     nombre;
    std::string                     archivo;
};
*/

struct Textura {
    std::string                     nombre;
    std::string                     archivo;
};

struct Template_y {
    std::string                     nombre;
    std::string                     archivo;
};

struct Imagen {
    std::string                     nombre;
    std::string                     archivo;
};

struct Animacion_y {
    std::string                     descripcion;
    std::string                     archivo;
    int                             periodo;
    int                             cuadros;
};

struct TipoBonus_y {
    std::string                     tipo;
    int                             ancho;
    int                             alto;
    int                             salto;
    int                             velocidad;
    std::vector <Animacion_y>       animaciones;
    string                          sonido;
};

struct TipoEnemigo_y {
    std::string                     tipo;
    int                             ancho;
    int                             alto;
    int                             salto;
    int                             velocidad;
    int                             velocidady;
    std::vector <Animacion_y>       animaciones;
};

struct TipoObstaculo_y {
    std::string                     tipo;
    int                             ancho;
    int                             alto;
    std::vector <Animacion_y>       animaciones;
};

struct Sonido_p {
    std::string                     accion;
    std::string                     ruta;
};

struct TipoPersonaje_y {
    std::string                     tipo;
    int                             ancho;
    int                             alto;
    int                             salto;
    int                             velocidad;
    int                             velocidady;
    int                             margen_scroll;
    std::vector <Animacion_y>       animaciones;
    std::vector <Sonido_p>          sonidos;
};

struct TipoPrincesa_y {
    int                             ancho;
    int                             alto;
    int                             salto;
    int                             velocidad;
    std::vector <Animacion_y>       animaciones;
};

struct Juego {
    Conexion_y                      conexion;
    Pantalla_y                      pantalla;
    Parametros                      parametros;
    //Nivel_y                         nivel;
    std::vector <Nivel_y>           niveles;
    //std::vector <Sonido_y>          sonidos;
    std::vector <Textura>           texturas;
    std::vector <Template_y>        templates;
    std::vector <Imagen>            imagenes;
    std::vector <TipoPersonaje_y>   tiposPersonaje;
    std::vector <TipoBonus_y>       tiposBonus;
    std::vector <TipoEnemigo_y>     tiposEnemigo;
    std::vector <TipoObstaculo_y>   tiposObstaculo;
    TipoPrincesa_y                  tipoPrincesa;
};


void print_parsed_yaml(Juego& juego);
std::vector<std::string> parser_lista_niveles( Juego& juego );
void parsear( std::string filename , Juego& juego );

#endif  /* YAMLPARSER_H_ */
